//functionName:调用原生函数名,字符串类型
//functionVals:调用原生函数参数值，字符串数组数据，无参数传空串
//返回值为字符串类型
function callNativeFunction(functionName, functionValArr, callback) {
    var equipmentType = getEquipmentType();
    let obj = {}
    obj[FUNCTION_NAME_KEY] = functionName
    obj[FUNCTION_VALS_KEY] = functionValArr
    if (callback != null && callback != undefined) {
        var callback_name = 'C' + Math.random().toString(36).substr(2);
        window[callback_name] = function (callbackVal) {
            var isDeleteCallback1 = true;
            try {
                var callbackValObj = JSON.parse(callbackVal)
                isDeleteCallback1 = callbackValObj.isDeleteCallback;
                delete callbackValObj.isDeleteCallback;
                callbackVal = JSON.stringify(callbackValObj);
            } catch (err) {
            }

            callback(callbackVal);
            if (isDeleteCallback1) {
                delete window[callback_name]
            }
        };
        obj["callback"] = callback_name
    }
    if (equipmentType === EQUIPMENT_TYPE_ANDROID) {//安卓平台调用接口
        return AndroidNativeObject.callNativeFunction(JSON.stringify(obj));
    } else if (equipmentType === EQUIPMENT_TYPE_IOS) {//iOS平台调用接口
        return window.prompt(JSON.stringify(obj));
    }
    return "";
}


//显示toast
//msg:提示的消息 字符串类型
//location：提示消息展示的位置  常量，在constant.js里有定义，分中间TOAST_LOCATION_CENTER和底部TOAST_LOCATION_BOTTOM
function showToast(msgStr, location) {
    var vals = [msgStr, location];
    var result = callNativeFunction(TOAST_NAME, vals);
    console.info(result);
    return result;
}

//显示底部消息
//msg:提示的消息  字符串类型
function showBottomToast(msgStr) {
    console.info(msgStr);
    var result = showToast(msgStr, TOAST_LOCATION_BOTTOM);
    console.info(result)
}

//获取服务端地址
//返回值为字符串类型
function getServerUrl() {
    var result = callNativeFunction(GET_SERVER_URL_NAME, []);
    console.info(result)
    return result;
}

//启动登录界面
function startLoginUi() {
    var result = callNativeFunction(START_LOGIN_UI_NAME, []);
    console.info(result)
    return result;
}

//启动主页面
function startMainUi() {
    var result = callNativeFunction(START_MAIN_UI_NAME, []);
    console.info(result)
    return result;
}

//获取用户信息
//返回值为对象类型
function getUserInfo() {
    var result = callNativeFunction(GET_USER_INFO_NAME, []);
    console.info(result)
    return JSON.parse(result);
}

//保存用户信息
//存值必须为对象类型
function setUserInfo(userInfoObj) {
    var vals = [JSON.stringify(userInfoObj)];
    var result = callNativeFunction(SET_USER_INFO_NAME, vals);
    console.info(result)
    return result;
}

//数据持久化
//keyStr:需要保存数据key，字符串类型
//valStr:需要保存的数据 字符串类型
function setStorage(keyStr, valStr) {
    var vals = [keyStr, valStr];
    var result = callNativeFunction(SET_STORAGE_NAME, vals);
    console.info(result)
    return result;
}

//获取持久化数据
//keyStr:需要获取的数据key 字符串类型
//返回值为字符串类型
function getStorage(keyStr) {
    var vals = [keyStr];
    var result = callNativeFunction(GET_STORAGE_NAME, vals);
    console.info(result)
    return result;
}

//移除持久化数据
//keyStr:需要获取的数据key 字符串类型
//返回值为字符串类型
function removeStorage(keyStr) {
    var vals = [keyStr];
    var result = callNativeFunction(REMOVE_STORAGE_NAME, vals);
    console.info(result)
    return result;
}

//数据缓存
//keyStr:需要保存数据key，字符串类型
//valStr:需要保存的数据 字符串类型
function putCacheData(keyStr, valStr) {
    var vals = [keyStr, valStr];
    var result = callNativeFunction(PUT_CACHE_DATA_NAME, vals);
    console.info(result)
    return result;
}

//获取缓存数据
//keyStr:需要获取的数据key 字符串类型
//返回值为字符串类型
function getCacheDate(keyStr) {
    var vals = [keyStr];
    var result = callNativeFunction(GET_CACHE_DATE_NAME, vals);
    console.info(result)
    return result;
}

//移除缓存数据
//keyStr:需要获取的数据key 字符串类型
//返回值为字符串类型
function removeCacheDate(keyStr) {
    var vals = [keyStr];
    var result = callNativeFunction(REMOVE_CACHE_DATE_NAME, vals);
    console.info(result)
    return result;
}

//获取授权的所有模块数据
//返回值为对象类型
function getAllModelData() {
    var result = callNativeFunction(GET_ALL_MODEL_DATA_NAME, []);
    return JSON.parse(result);
}

//获取appVersion数据
//格式：{"versionName":"1.0.0","versionCode":"1","appName":"标准应用APP","packageName":"com.jxsc.standarapp","appId":"1111"}
//返回值为对象类型
function getAPPVersionInfo() {
    var result = callNativeFunction(GET_APP_VERSION_INFO_NAME, []);
    return JSON.parse(result);
}

//退出当前页面
//返回值为字符串类型
function exitCurrentUi() {
    var result = callNativeFunction(EXIT_CURRENT_UI_NAME, []);
    return result;
}

//退出页面时保存结果状态OK
//返回值为字符串类型
function setActivityResultOk() {
    var result = callNativeFunction(SET_ACTIVITY_RESULT_OK_NAME, []);
    return result;
}

//启动新的webView页面
//urlStr:启动的页面完整路径，字符类型
//返回值为字符串类型
function startNewUi(urlStr) {
    var vals = [urlStr];
    var result = callNativeFunction(START_NEW_UI_NAME, vals);
    return result;
}

//启动新的webView页面 Refer
function startNewUiAndExtraHeaders(urlStr, Refer) {
    var vals = [urlStr, JSON.stringify({ Referer: Refer })];
    var result = callNativeFunction('startNewUiAndExtraHeaders', vals);
    return result;
}

//启动新的横屏的全屏的webView页面
//urlStr:启动的页面完整路径，字符类型
//返回值为字符串类型
function startLandscapeNewUi(urlStr) {
    var vals = [urlStr];
    var result = callNativeFunction(START_LANDSCAPE_NEW_UI_NAME, vals);
    return result;
}

//启动新的webView页面并关闭当前页面
//urlStr:启动的页面完整路径，字符类型
//返回值为字符串类型
function startNewUiAndExitCurrentUi(urlStr) {
    var vals = [urlStr];
    var result = callNativeFunction(START_NEW_UI_AND_EXIT_CURRENT_UI_NAME, vals);
    return result;
}

//启动二维码扫码界面，通过回调函数返回扫码结果
//callback:回调函数，扫码结果通过该函数返回
//返回值为字符串类型
function startQRCodeUi(callback) {
    var result = callNativeFunction(START_QR_CODE_UI_NAME, [], callback);
    return result;
}

//显示系统状态栏消息
//title:状态栏消息标题，字符类型
//msg:状态栏消息内容，字符类型
//返回值为字符串类型
function showNotification(title, msg) {
    var vals = [title, msg];
    var result = callNativeFunction(SHOW_NOTIFICATION_NAME, vals);
    return result;
}

//获取手机当前手机亮度值
//返回值为字符串类型 0-100数值大小的字符串
function getPhoneCurrentLight() {
    var result = callNativeFunction(GET_PHONE_CURRENT_LIGHT_NAME, []);
    console.info(result)
    return result;
}

//设置手机当前手机亮度值
//light:设置亮度值范围在0-100，字符串类型
//返回值为字符串类型
function setPhoneLight(light) {
    var vals = [light];
    var result = callNativeFunction(SET_PHONE_LIGHT_NAME, vals);
    console.info(result)
    return result;
}

//获取手机当前手机声音值
//返回值为字符串类型 0-100数值大小的字符串
function getPhoneCurrentAudio() {
    var result = callNativeFunction(GET_PHONE_CURRENT_AUDIO_NAME, []);
    console.info(result)
    return result;
}

//设置手机当前手机声音值
//light:设置声音值范围在0-100，字符串类型
//返回值为字符串类型
function setPhoneMediaVolume(volume) {
    var vals = [volume];
    var result = callNativeFunction(SET_PHONE_MEDIA_VOLUME_NAME, vals);
    console.info(result)
    return result;
}

//获取手机当前网路类型
//返回值为字符串类型 none、wifi、mobile
function getNetworkType() {
    var result = callNativeFunction(GET_NETWORK_TYPE_NAME, []);
    console.info(result)
    return result;
}

//获取当前手机系统语言。
//返回值为字符串类型 返回当前系统语言。例如：当前设置的是“中文-中国”，则返回“zh-CN”
function getSystemLanguage() {
    var result = callNativeFunction(GET_SYSTEM_LANGUAGE_NAME, []);
    console.info(result)
    return result;
}

//获取当前手机系统版本号
//返回值为字符串类型
function getSystemVersion() {
    var result = callNativeFunction(GET_SYSTEM_VERSION_NAME, []);
    console.info(result)
    return result;
}

// 通知栏消息推送的websocket
function setWebSocket(url, token) {
    var vals = [url, token];
    var result = callNativeFunction('setWebSocket', vals);
    return result;
}

//获取手机型号
//返回值为字符串类型
function getSystemModel() {
    var result = callNativeFunction(GET_SYSTEM_MODEL_NAME, []);
    console.info(result)
    return result;
}

//获取手机厂商
//返回值为字符串类型
function getDeviceBrand() {
    var result = callNativeFunction(GET_DEVICE_BRAND_NAME, []);
    console.info(result)
    return result;
}

//拨打电话
//phoneNumber:需要拨打的手机号
//返回值为字符串类型
function callPhoneNumber(phoneNumber) {
    var vals = [phoneNumber];
    var result = callNativeFunction(CALL_PHONE_NUMBER_NAME, vals);
    console.info(result)
    return result;
}

//启动地图界面获取选择地图的位置信息，通过回调函数参数返回结果
//callback:回调函数，定位结果通过该函数返回。
//回调函数参数： 字符串类型：pointInfo:{"point":{"lng":106.37502962715,"lat":29.607758727601},"address":{"country":"","city":"重庆市","city_code":0,"district":"沙坪坝区","province":"重庆市","street":"西园北街","street_number":""}}
//point(定位结果{"lng":106.37497327161,"lat":29.607894879671})
//address(定位结果{"province":"重庆市","city":"重庆市","district":"沙坪坝区","street":"西园北街","streetNumber":""})
//返回值为字符串类型
function startMap(callback) {
    var result = callNativeFunction(START_BAIDU_MAP_NAME, [], callback);
    console.info(result)
    return result;
}

//启动手机录音  需要在调用了setOnAudioStatusUpdateListener(callback)之后调用
//返回值为字符串类型
function startAudioRecorder() {
    var result = callNativeFunction(START_AUDIO_RECORDER_NAME, []);
    console.info(result)
    return result;
}

//停止手机录音  录音文件通过回调函数type为onStop filePath获取。
//需要在调用了setOnAudioStatusUpdateListener(callback)之后调用
//返回值为字符串类型
function stopAudioRecorder() {
    var result = callNativeFunction(STOP_AUDIO_RECORDER_NAME, []);
    console.info(result)
    return result;
}

//取消手机录音  不返回录音文件
//需要在调用了setOnAudioStatusUpdateListener(callback)之后调用
//返回值为字符串类型
function cancelAudioRecorder() {
    var result = callNativeFunction(CANCEL_AUDIO_RECORDER_NAME, []);
    console.info(result)
    return result;
}

//设置录音监听函数
//callback:回调函数，麦克风状态和录音结果通过该函数返回。
//回调函数参数： 字符串类型：{"type" : "onUpdate","db":7410,"time":"1590566985901"}、{"type" : "onStop","db":-1,"filePath":"文件绝对路径"}、{"type" : "onCancel","db":-1}
//type： onUpdate/onStop/onCancel(回调类型)
//db： 麦克分贝值
//time： 录音时长
//filePath： 录音文件路径
//返回值为字符串类型
function setOnAudioStatusUpdateListener(callback) {
    var result = callNativeFunction(SET_ON_AUDIO_STATUS_UPDATE_LISTENER_NAME, [], callback);
    console.info(result)
    return result;
}

//启动动态权限检查
//permissionType：权限类型（Android 动态权限类型：如'android.permission.READ_CALENDAR'）
//callback：如果授权成功则回调此函数 否则显示授权弹窗。
//返回值为字符串类型
function startCheckPermission(permissionType, callback) {
    var vals = [permissionType];
    var result = callNativeFunction(START_CHECK_PERMISSION_NAME, vals, callback);
    console.info(result)
    return result;
}

//创建SDK对象
//clzName:字符串类型，需要创建的对象完整类名，如：'com.jinxin.idcardreadersdk.IDCardReadHolder'
//
//paramsTypeStr：字符串的数组的字符串类型，即字符串的数组转义成字符类型，调用创建对象构造函数的参数类型列表，
//注意: 1.如果类型为回调接口type传OTHER_SDK_CALLBACK_PARAM_NAME，如：OTHER_SDK_CALLBACK_PARAM_NAME
//     2.如果类型activity type传OTHER_SDK_ACTIVITY_PARAM_NAME，如：OTHER_SDK_ACTIVITY_PARAM_NAME
//     3.如果类型webView type传OTHER_SDK_WEB_VIEW_PARAM_NAME，如：OTHER_SDK_WEB_VIEW_PARAM_NAME
//
//paramsValStr:字符串的数组的字符串类型，即字符串的数组转义成字符类型，调用创建对象构造函数的参数列表
//注意：
//      1.如果需要activity类型传OTHER_SDK_ACTIVITY_PARAM_NAME；
//      2.如果需要webView类型传OTHER_SDK_WEB_VIEW_PARAM_NAME；
//      3.如果回调类型传对应的回调的完整类名,如：com.jinxin.idcardreadersdk.IDCardReadHolder$ICallback
//          此类的所有回调方法都会通过设置的callback回调，回调参数是json字符串类型，具体方法名通过key:methodName拿到，函数值顺序通过key:args1、args2、args3...等依次返回
//
//isOnceCallback：callback 回调次数，如果为true就只回调一次 否则只要收到消息就会通过callback回调，除非页面调用exitCurrentUi退出销毁监听。
//
//callback:接收回调的函数
function newSDKObj(clzName, paramsTypeStr, paramsValStr, isOnceCallback = true, callback) {
    var vals = [clzName, paramsTypeStr, paramsValStr, isOnceCallback];
    var result = callNativeFunction(NEW_SDK_OBJ_NAME, vals, callback);
    console.info(result)
    return result;
}

//调用SDK对象里方法
//clzName:字符串类型，需要调用的对象完整类名，如：'com.jinxin.idcardreadersdk.IDCardReadHolder'
//methodName:需要调用的方法名
//paramsTypeStr：字符串的数组的字符串类型，即字符串的数组转义成字符类型，调用创建对象构造函数的参数类型列表，
//注意:
//      1.如果类型为回调接口type传OTHER_SDK_CALLBACK_PARAM_NAME，如：OTHER_SDK_CALLBACK_PARAM_NAME
//      2.如果类型activity type传OTHER_SDK_ACTIVITY_PARAM_NAME，如：OTHER_SDK_ACTIVITY_PARAM_NAME
//      3.如果类型webView type传OTHER_SDK_WEB_VIEW_PARAM_NAME，如：OTHER_SDK_WEB_VIEW_PARAM_NAME
//
//paramsValStr:字符串的数组的字符串类型，即字符串的数组转义成字符类型，调用创建对象构造函数的参数列表
//注意：
//      1.如果需要activity类型传OTHER_SDK_ACTIVITY_PARAM_NAME；
//      2.如果需要webView类型传OTHER_SDK_WEB_VIEW_PARAM_NAME；
//      3.如果回调类型传对应的回调的完整类名,如：com.jinxin.idcardreadersdk.IDCardReadHolder$ICallback
//          此类的所有回调方法都会通过设置的callback回调，回调参数是json字符串类型，具体方法名通过key:methodName拿到，函数值顺序通过key:args1、args2、args3...等依次返回
//
//isOnceCallback：callback 回调次数，如果为true就只回调一次 否则只要收到消息就会通过callback回调，除非页面调用exitCurrentUi退出销毁监听。
//
//callback:接收回调的函数
function callSDKMethod(clzName, methodName, paramsTypeStr, paramsValStr, isOnceCallback = true, callback) {
    var vals = [clzName, methodName, paramsTypeStr, paramsValStr, isOnceCallback];
    var result = callNativeFunction(CALL_SDK_METHOD_NAME, vals, callback);
    console.info(result)
    return result;
}

//获取SDK单例对象
//clzName:字符串类型，需要获取的对象完整类名，如：'com.jinxin.idcardreadersdk.IDCardReadHolder'
//methodName:获取单例的方法名，如:'getInstance'
//paramsTypeStr：字符串的数组的字符串类型，即字符串的数组转义成字符类型，调用创建对象构造函数的参数类型列表，
//注意:
//      1.如果类型为回调接口type传OTHER_SDK_CALLBACK_PARAM_NAME，如：OTHER_SDK_CALLBACK_PARAM_NAME
//      2.如果类型activity type传OTHER_SDK_ACTIVITY_PARAM_NAME，如：OTHER_SDK_ACTIVITY_PARAM_NAME
//      3.如果类型webView type传OTHER_SDK_WEB_VIEW_PARAM_NAME，如：OTHER_SDK_WEB_VIEW_PARAM_NAME
//
//paramsValStr:字符串的数组的字符串类型，即字符串的数组转义成字符类型，调用创建对象构造函数的参数列表
//注意：
//      1.如果需要activity类型传OTHER_SDK_ACTIVITY_PARAM_NAME；
//      2.如果需要webView类型传OTHER_SDK_WEB_VIEW_PARAM_NAME；
//      3.如果回调类型传对应的回调的完整类名,如：com.jinxin.idcardreadersdk.IDCardReadHolder$ICallback
//          此类的所有回调方法都会通过设置的callback回调，回调参数是json字符串类型，具体方法名通过key:methodName拿到，函数值顺序通过key:args1、args2、args3...等依次返回
//
//isOnceCallback：callback 回调次数，如果为true就只回调一次 否则只要收到消息就会通过callback回调，除非页面调用exitCurrentUi退出销毁监听。
//
//callback:接收回调的函数
function getSingletonSDKObj(clzName, methodName, paramsTypeStr, paramsValStr, isOnceCallback = true, callback) {
    var vals = [clzName, methodName, paramsTypeStr, paramsValStr, isOnceCallback];
    var result = callNativeFunction(GET_SINGLETON_SDK_OBJ_NAME, vals, callback);
    console.info(result)
    return result;
}

//调用SDK内静态方法
//clzName:字符串类型，需要调用的对象完整类名，如：'com.jinxin.idcardreadersdk.IDCardReadHolder'
//methodName:获取单例的方法名，如:'getInstance'
//paramsTypeStr：字符串的数组的字符串类型，即字符串的数组转义成字符类型，调用创建对象构造函数的参数类型列表，
//注意:
//      1.如果类型为回调接口type传OTHER_SDK_CALLBACK_PARAM_NAME，如：OTHER_SDK_CALLBACK_PARAM_NAME
//      2.如果类型activity type传OTHER_SDK_ACTIVITY_PARAM_NAME，如：OTHER_SDK_ACTIVITY_PARAM_NAME
//      3.如果类型webView type传OTHER_SDK_WEB_VIEW_PARAM_NAME，如：OTHER_SDK_WEB_VIEW_PARAM_NAME
//
//paramsValStr:字符串的数组的字符串类型，即字符串的数组转义成字符类型，调用创建对象构造函数的参数列表
//注意：
//      1.如果需要activity类型传OTHER_SDK_ACTIVITY_PARAM_NAME；
//      2.如果需要webView类型传OTHER_SDK_WEB_VIEW_PARAM_NAME；
//      3.如果回调类型传对应的回调的完整类名,如：com.jinxin.idcardreadersdk.IDCardReadHolder$ICallback
//          此类的所有回调方法都会通过设置的callback回调，回调参数是json字符串类型，具体方法名通过key:methodName拿到，函数值顺序通过key:args1、args2、args3...等依次返回
//
//isOnceCallback：callback 回调次数，如果为true就只回调一次 否则只要收到消息就会通过callback回调，除非页面调用exitCurrentUi退出销毁监听。
//
//callback:接收回调的函数
function callStaticSDKMethod(clzName, methodName, paramsTypeStr, paramsValStr, isOnceCallback = true, callback) {
    var vals = [clzName, methodName, paramsTypeStr, paramsValStr, isOnceCallback];
    var result = callNativeFunction(CALL_STATIC_SDK_METHOD_NAME, vals, callback);
    console.info(result)
    return result;
}

//启动NFC读卡界面 启动界面之后需要设置NFC操作类型
//url:展示NFC操作界面，字符串类型
//isFull:是否全屏展示
//isPortrait：是否竖屏展示
function startNFCUi(url, isFull, isPortrait) {
    var vals = [url, isFull, isPortrait];
    var result = callNativeFunction(START_NFC_UI_NAME, vals);
    console.info(result)
    return result;
}

//读取NFC数据
//action:启动的NFC界面，字符串类型,做的事情类型，[NFC_ACTION_TYPE_READ_NOT_NDEF，NFC_ACTION_TYPE_READ_NDEF_TEXT，NFC_ACTION_TYPE_READ_NDEF_URI，NFC_ACTION_TYPE_WRITE_NOT_NDEF，NFC_ACTION_TYPE_WRITE_NDEF_TEXT，NFC_ACTION_TYPE_WRITE_NDEF_URI]
//callback：读取数据回调，只有一个参数， 字符串类型
function readNFCData(action, callback) {
    var vals = [action];
    var result = callNativeFunction(READ_NFC_DATA_NAME, vals, callback);
    console.info(result)
    return result;
}

//写入NFC数据
//action:写入的NFC界面，字符串类型,做的事情类型，[NFC_ACTION_TYPE_READ_NOT_NDEF，NFC_ACTION_TYPE_READ_NDEF_TEXT，NFC_ACTION_TYPE_READ_NDEF_URI，NFC_ACTION_TYPE_WRITE_NOT_NDEF，NFC_ACTION_TYPE_WRITE_NDEF_TEXT，NFC_ACTION_TYPE_WRITE_NDEF_URI]
//writeParameter：写入的数据参数
function writeNFCData(action, writeParameter) {
    var vals = [action, writeParameter];
    var result = callNativeFunction(WRITE_NFC_DATA_NAME, vals);
    console.info(result)
    return result;
}

//初始化蓝牙
//蓝牙有个服务端和客户端，当前设备被其他蓝牙设备连接上，则当前设备就作为服务端收发消息，其他蓝牙设备作为客户端
//同时只能有一个设备与之连接，如果需要连接其他设备，就需要释放当前蓝牙设备重新初始化。
//uuid:用于设备和设备间蓝牙通信时用，可以开发者自己创建一个 也可以传个空串
//serviceName:用于启动蓝牙监听数据时用，可以开发者自己创建一个 也可以传个空串
//callback：初始回调，返回值为json对象两个属性 code和msg
function initBluetooth(uuid, serviceName, callback) {
    var vals = [uuid, serviceName];
    var result = callNativeFunction(INIT_BLUETOOTH_NAME, vals, callback);
    console.info(result)
    return result;
}

//检查蓝牙是否打开
//callback：检查是否打开回调，返回值为json对象一个属性 state
function isBluetoothEnabled(callback) {
    var vals = [];
    var result = callNativeFunction(IS_BLUETOOTH_ENABLED_NAME, vals, callback);
    console.info(result)
    return result;
}

//打开蓝牙
function openBluetooth() {
    var vals = [];
    var result = callNativeFunction(OPEN_BLUETOOTH_NAME, vals);
    console.info(result)
    return result;
}

//设置蓝牙搜索监听
//callback：蓝牙搜索结果回调，返回值为json对象两个属性 type和msg， 根据type类型处理对应事件
function setBluetoothFindListener(callback) {
    var vals = [];
    var result = callNativeFunction(SET_BLUETOOTH_FIND_LISTENER_NAME, vals, callback);
    console.info(result)
    return result;
}

//设置蓝牙配对监听
//callback：蓝牙配对结果回调，返回值为json对象三个属性 device、type和msg， device对象有三个属性：name名字，address地址值，bondState绑定状态12为绑定；根据type类型处理对应事件
function setBluetoothBondListener(callback) {
    var vals = [];
    var result = callNativeFunction(SET_BLUETOOTH_BOND_LISTENER_NAME, vals, callback);
    console.info(result)
    return result;
}

//设置蓝牙状态是否打开或者打开关闭中监听。
//callback：蓝牙状态结果回调，返回值为json对象两个属性 type和msg 根据type类型处理对应事件
function setBluetoothStateListener(callback) {
    var vals = [];
    var result = callNativeFunction(SET_BLUETOOTH_STATE_LISTENER_NAME, vals, callback);
    console.info(result)
    return result;
}

//设置蓝牙是否能被搜索到监听。
//callback：蓝牙是否能被搜索结果回调，返回值为json对象两个属性 type和msg 根据type类型处理对应事件
function setBluetoothVisibilityListener(callback) {
    var vals = [];
    var result = callNativeFunction(SET_BLUETOOTH_VISIBILITY_LISTENER_NAME, vals, callback);
    console.info(result)
    return result;
}

//打开在手机在未连接设备时，启动服务，被动等待其他设备连接，监听与之连接和发送消息的服务。
//callback：启动蓝牙服务，当其他蓝牙设备连接时回调，返回值为json对象三个属性 device、type和msg 根据type类型处理对应事件
//device对象有三个属性：name名字，address地址值，bondState绑定状态12为绑定；
function startBluetoothServer(callback) {
    var vals = [];
    var result = callNativeFunction(START_BLUETOOTH_SERVER_NAME, vals, callback);
    console.info(result)
    return result;
}

//启动蓝牙服务,并且连接设备成功之后，并设置此回调，发送消息完通过此回调回调。
//callback：启动蓝牙服务，当发送消息时回调，返回值为json对象两个属性 code和msg 根据code类型处理对应事件 0为成功 其他为失败
function setBluetoothServerSendDataListener(callback) {
    var vals = [];
    var result = callNativeFunction(SET_BLUETOOTH_SERVER_SEND_DATA_LISTENER_NAME, vals, callback);
    console.info(result)
    return result;
}

//启动蓝牙服务并且连接设备成功之后，并设置此回调，收到消息后通过此回调回调。
//callback：启动蓝牙服务，当接收到其他蓝牙设备时回调，返回值为json对象两个属性 code和msg 根据code类型处理对应事件 0为成功 其他为失败
function setBluetoothServerReceiveDataListener(callback) {
    var vals = [];
    var result = callNativeFunction(SET_BLUETOOTH_SERVER_RECEIVE_DATA_LISTENER_NAME, vals, callback);
    console.info(result)
    return result;
}

//停止蓝牙服务端。
function stopBluetoothServer() {
    var vals = [];
    var result = callNativeFunction(STOP_BLUETOOTH_SERVER_NAME, vals);
    console.info(result)
    return result;
}

//使用此接口主动连接其他蓝牙设备。
//address:需要连接的蓝牙设备地址，当前设备作为客户端
//callback：当和其他蓝牙设备连接上时回调，返回值为json对象三个属性 device、type和msg 根据type类型处理对应事件
function startBluetoothClient(address, callback) {
    var vals = [address];
    var result = callNativeFunction(START_BLUETOOTH_CLIENT_NAME, vals, callback);
    console.info(result)
    return result;
}

//连接上其他设备之后，并设置此回调，发送消息后通过此回调回调。
//callback：连接上其他设备之后，并设置此回调，发送消息后通过此回调回调，返回值为json对象两个属性 code和msg 根据code类型处理对应事件 0为成功 其他为失败
function setBluetoothClientSendDataListener(callback) {
    var vals = [];
    var result = callNativeFunction(SET_BLUETOOTH_CLIENT_SEND_DATA_LISTENER_NAME, vals, callback);
    console.info(result)
    return result;
}

//连接上其他设备之后，并设置此回调，收到消息后通过此回调回调。
//callback：连接上其他设备之后，并设置此回调，收到消息后通过此回调回调。返回值为json对象两个属性 code和msg 根据code类型处理对应事件 0为成功 其他为失败
function setBluetoothClientReceiveDataListener(callback) {
    var vals = [];
    var result = callNativeFunction(SET_BLUETOOTH_CLIENT_RECEIVE_DATA_LISTENER_NAME, vals, callback);
    console.info(result)
    return result;
}

//释放蓝牙资源。
function releaseBluetoothSource() {
    var vals = [];
    var result = callNativeFunction(RELEASE_BLUETOOTH_SOURCE_NAME, vals);
    console.info(result)
    return result;
}

//设置蓝牙设备可以在一定时间范围内被搜索到。
//time:蓝牙显示时间，单位为s,整数类型
function setBluetoothDiscoverable(time) {
    var vals = [time];
    var result = callNativeFunction(SET_BLUETOOTH_DISCOVERABLE_NAME, vals);
    console.info(result)
    return result;
}

//启动搜索蓝牙设备。收到到设备，通过setBluetoothFindListener设置的监听回调
function startBluetoothDiscovery() {
    var vals = [];
    var result = callNativeFunction(START_BLUETOOTH_DISCOVERY_NAME, vals);
    console.info(result)
    return result;
}

//关闭手机蓝牙功能。收到到设备，通过setBluetoothStateListener设置的监听回调
function closeBluetooth() {
    var vals = [];
    var result = callNativeFunction(CLOSE_BLUETOOTH_NAME, vals);
    console.info(result)
    return result;
}

//更新蓝牙绑定列表。
function updateBluetoothBondDevice() {
    var vals = [];
    var result = callNativeFunction(UPDATE_BLUETOOTH_BOND_DEVICE_NAME, vals);
    console.info(result)
    return result;
}

//更新蓝牙绑定列表。
//data：需要发送的数据，字符串类型，框架APP会根据当前设备连接的设备进行自动发送，发送数据时h5端不用区分是服务端还是客户端
function sendBluetoothData(data) {
    var vals = [data];
    var result = callNativeFunction(SEND_BLUETOOTH_DATA_NAME, vals);
    console.info(result)
    return result;
}

//通过设备列表position获取设备，从0开始。
//position：通过设备列表接口getBluetoothAllDevice()获取的设备列表，position为其列表下标，从0开始。
//callback:查询到设备返回json对象，其中属性为device代表设备。
function getBluetoothDeviceToPosition(position, callback) {
    console.log(position)
    var vals = [position];
    var result = callNativeFunction(GET_BLUETOOTH_DEVICE_TO_POSITION_NAME, vals, callback);
    console.info(result)
    return result;
}

//通过设备address获取设备。
//address：设备地址
//callback:查询到设备返回json对象，其中属性为device代表设备。
function getBluetoothDeviceToAddress(address, callback) {
    var vals = [address];
    var result = callNativeFunction(GET_BLUETOOTH_DEVICE_TO_ADDRESS_NAME, vals, callback);
    console.info(result)
    return result;
}

//获取所有设备。
//callback:查询到设备返回json对象，其中属性为devices数组代表设备列表。
function getBluetoothAllDevice(callback) {
    var vals = [];
    var result = callNativeFunction(GET_BLUETOOTH_ALL_DEVICE_NAME, vals, callback);
    console.info(result)
    return result;
}

//获取设备个数。
//callback:查询到设备返回json对象，其中属性为size代表设备个数。
function getBluetoothDeviceSize(callback) {
    var vals = [];
    var result = callNativeFunction(GET_BLUETOOTH_DEVICE_SIZE_NAME, vals, callback);
    console.info(result)
    return result;
}

//传入设备列表address获取设备，创建蓝牙配对。
//address：通过设备列表接口getBluetoothAllDevice()获取的设备列表，position为其列表下标，从0开始。
//绑定结果通setBluetoothBondListener设置的回调返回
function createBluetoothBondToPosition(position) {
    var vals = [position];
    var result = callNativeFunction(CREATE_BLUETOOTH_BOND_TO_POSITION_NAME, vals);
    console.info(result)
    return result;
}

//传入设备列表position获取设备，创建蓝牙配对。
//position：设备地址
//绑定结果通setBluetoothBondListener设置的回调返回
function createBluetoothBondToAddress(address) {
    var vals = [address];
    var result = callNativeFunction(CREATE_BLUETOOTH_BOND_TO_ADDRESS_NAME, vals);
    console.info(result)
    return result;
}

//用于启动第三方SDK里的目标activity。
//targetActivityPackagePath：目标activity 包名+类名
function startCustomNativeUi(targetActivityPackagePath) {
    var vals = [targetActivityPackagePath];
    var result = callNativeFunction(START_CUSTOM_NATIVE_UI_NAME, vals);
    console.info(result)
    return result;
}

//用于启动带Request第三方SDK里的目标activity。
//targetActivityPackagePath：目标activity 包名+类名
//callback:目标界面退出成功返回数据的json数据
function startCustomNativeUiRequestCode(targetActivityPackagePath, callback) {
    var vals = [targetActivityPackagePath];
    var result = callNativeFunction(START_CUSTOM_NATIVE_UI_REQUEST_CODE_NAME, vals, callback);
    console.info(result)
    return result;
}

// 打开视频列表
// 返回数据 [1]路径 [2]文件名 [3]文件大小（单位byte）
function openVideoAlbum(callBack) {
    var vals = [];
    var result = callNativeFunction('doPickVideoFromSystem', vals, callBack);
    return result;
}

//上传文件方法
//url:上传文件接口地址；
//headerMapJson；上传接口头部需要的参数，map集合的json字符串，如没有传""或null；
//paramsJson：上传接口需要的参数，map集合的json字符串，如没有传""或null;
//fileKey:上传文件的key值；
//filePath;文件绝对路径；
//返回值为字符串类型
function upLoadFile(url, headerMapJson, paramsJson, fileKey, filePath, callBack) {
    var vals = [url, headerMapJson, paramsJson, fileKey, filePath];
    var result = callNativeFunction('upLoadFile', vals, callBack);
    return result;
}

//页面结束监听
function setDestroyCallBack(callback) {
    var result = callNativeFunction("setDestroyCallBack", [], callback);
    return result;
}
